package com.tlgen.orm.utils.dataSource;

import com.tlgen.orm.components.dataSource.DataSourceContextHolder;
import com.tlgen.orm.utils.SpringUtils;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

public class DBUtils {

    // 单例缓存避免重复创建（线程安全）
    private static final ConcurrentHashMap<String, JdbcTemplate> CACHE = new ConcurrentHashMap<>();

    private static JdbcTemplate getJdbcTemplate() {
        return CACHE.computeIfAbsent("defaultJdbcTemplate", k ->
                Optional.of(SpringUtils.getBean(DataSource.class))
                        .map(DBUtils::createSafeTemplate)
                        .orElseThrow(() -> new IllegalStateException("DataSource bean not found"))
        );
    }

    private static JdbcTemplate createSafeTemplate(DataSource dataSource) {
        JdbcTemplate template = new JdbcTemplate(dataSource);
        // 安全参数配置
        template.setFetchSize(100);               // 防止内存溢出
        template.setMaxRows(5000);                // 限制最大行数
        template.setQueryTimeout(30);             // 30秒超时
        return template;
    }

    public static JdbcTemplate get() {
        String currentDs = DataSourceContextHolder.getCurrentDataSource();
        JdbcTemplate masterDb = currentDs != null ?
                CACHE.get(currentDs) :
                CACHE.get("master_db");
        // 支持 spring boot 方式的默认连接配置, 单个数据源时使用
        return Optional.ofNullable(masterDb).orElse(getJdbcTemplate());
    }

}